import argparse
from keras import optimizers
from train import train_model
from keras.callbacks import LearningRateScheduler


def evaluation(s):
    obj = eval(str(s))
    if isinstance(obj, type):
        obj = obj()
    return obj


def main(args=None):
    parser = argparse.ArgumentParser()
    default_str = 'default: %(default)s'
    parser.add_argument('name', type=str)
    parser.add_argument('--candidate_file', required=True)
    parser.add_argument('--candidate_vol_file', required=True)
    parser.add_argument('--info_file', required=True)
    parser.add_argument('--modelname', default='vgg13', help=default_str)
    parser.add_argument('--valid_folds', type=int, nargs='*', default=[0, ], help=default_str)
    parser.add_argument('--batchsize', type=int, default=32, help=default_str)
    parser.add_argument('--shift_range', type=int, nargs=3, default=[4, 4, 4], help=default_str)
    parser.add_argument('--crop_shape', type=int, nargs=3, default=[64, 64, 64], help=default_str)
    parser.add_argument('--seed', type=int, default=2112, help=default_str)
    parser.add_argument('--optimizer', type=lambda x: getattr(optimizers, x), default=optimizers.Adadelta, help=default_str)
    parser.add_argument('--lr', type=float, default=1.0, help=default_str)
    parser.add_argument('--nb_epoches', type=int, default=10000, help=default_str)
    parser.add_argument('--base_nb_filters', type=int, default=32, help=default_str)
    parser.add_argument('--weight_decay', type=float, default=1e-4, help=default_str)
    parser.add_argument('--loadfrom')
    parser.add_argument('--callbacks', type=evaluation, nargs='*', default=[], help=default_str)
    namespace = parser.parse_args(args)
    train_model(**vars(namespace))
